package com.xxxtea.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xxxtea.common.Result;
import com.xxxtea.dto.PageQuery;
import com.xxxtea.entity.UserAddress;
import com.xxxtea.service.UserAddressService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * 用户地址管理控制器
 * 
 * 提供用户地址的增删改查功能，包括：
 * - 设置默认用户地址
 * - 新增用户地址
 * - 删除用户地址
 * - 更新用户地址信息
 * - 查询地址详情
 * - 获取地址列表
 * - 分页查询地址
 * 
 * @author xxxtea
 * @version 1.0
 * @since 2024-01-01
 */
@Slf4j
@Api("用户地址接口")
@RestController
@RequestMapping("/userAddress")
public class UserAddressController {
	
	/**
	 * 用户地址服务
	 */
	@Resource
	private UserAddressService userAddressService;

	/**
	 * 设置默认用户地址
	 * 先将所有地址设置为非默认，再将指定地址设置为默认
	 * 
	 * @param id 地址ID
	 * @return 操作结果
	 */
	@PostMapping("/setCurrent/{id}")
	@ApiOperation("设置默认用户地址")
	public Result<String> setCurrent(@PathVariable Integer id) {
		// 先将所有地址设置为非默认状态
		userAddressService.lambdaUpdate()
				.set(UserAddress::getIsDefault, UserAddress.IsDefault.NO)
				.update();
		// 再将指定地址设置为默认状态
		userAddressService.lambdaUpdate()
				.set(UserAddress::getIsDefault, UserAddress.IsDefault.YES)
				.eq(UserAddress::getId, id)
				.update();
		return Result.success();
	}

	/**
	 * 新增用户地址
	 * 
	 * @param request 用户地址信息
	 * @return 操作结果
	 */
	@PostMapping
	@ApiOperation("新增用户地址")
	public Result<String> save(@RequestBody UserAddress request) {
		// 调用服务层保存地址信息
		if (!userAddressService.save(request)) {
			return Result.error("添加失败!");
		}
		return Result.success();
	}

	/**
	 * 根据ID删除用户地址
	 * 
	 * @param id 地址ID
	 * @return 操作结果
	 */
	@DeleteMapping("/{id}")
	@ApiOperation("删除用户地址")
	public Result<String> removeById(@PathVariable String id) {
		// 调用服务层删除地址
		if (!userAddressService.removeById(id)) {
			return Result.error("删除失败!");
		}
		return Result.success();
	}

	/**
	 * 更新用户地址信息
	 * 
	 * @param request 更新的地址信息
	 * @return 操作结果
	 */
	@PutMapping
	@ApiOperation("更新用户地址")
	public Result<String> updateById(@RequestBody UserAddress request) {
		// 调用服务层更新地址信息
		if (!userAddressService.updateById(request)) {
			return Result.error("更新失败!");
		}
		return Result.success();
	}

	/**
	 * 根据ID查询用户地址详情
	 * 
	 * @param id 地址ID
	 * @return 地址详情
	 */
	@GetMapping("/{id}")
	@ApiOperation("查询用户地址详情")
	public Result<UserAddress> getById(@PathVariable String id) {
		return Result.success(userAddressService.getById(id));
	}

	/**
	 * 查询用户地址列表
	 * 支持条件查询，按默认地址和ID降序排列
	 * 
	 * @param request 查询条件
	 * @return 地址列表
	 */
	@GetMapping("/list")
	@ApiOperation("查询用户地址列表")
	public Result<List<UserAddress>> list(UserAddress request) {
		// 构建查询条件，优先显示默认地址，然后按ID降序排列
		LambdaQueryWrapper<UserAddress> wrapper = new LambdaQueryWrapper<>(request);
		wrapper.orderByDesc(UserAddress::getIsDefault);
		wrapper.orderByDesc(UserAddress::getId);
		return Result.success(userAddressService.list(wrapper));
	}

	/**
	 * 分页查询用户地址
	 * 支持条件查询和分页，按默认地址和ID降序排列
	 * 
	 * @param request 分页查询条件
	 * @return 分页结果
	 */
	@PostMapping("/page")
	@ApiOperation("分页查询用户地址")
	public Result<Page<UserAddress>> page(@RequestBody PageQuery<UserAddress> request) {
		// 构建查询条件，优先显示默认地址，然后按ID降序排列
		LambdaQueryWrapper<UserAddress> wrapper = new LambdaQueryWrapper<>(request.getParam());
		wrapper.orderByDesc(UserAddress::getIsDefault);
		wrapper.orderByDesc(UserAddress::getId);
		// 执行分页查询
		Page<UserAddress> pageResult = userAddressService.page(request.toPage(), wrapper);
		return Result.success(pageResult);
	}
}